package uy.org.softtech.cssuite.servicios.impl;

import static org.springframework.util.Assert.notNull;

import java.util.Set;

import javax.annotation.PostConstruct;
import javax.annotation.Resource;

import org.apache.log4j.Logger;
import org.springframework.stereotype.Service;

import uy.org.softtech.cssuite.core.Servicio;
import uy.org.softtech.cssuite.entidad.finanzas.Factura;
import uy.org.softtech.cssuite.entidad.finanzas.Movimiento;
import uy.org.softtech.cssuite.entidad.finanzas.Pago;
import uy.org.softtech.cssuite.repositorios.RepositorioFacturas;
import uy.org.softtech.cssuite.repositorios.RepositorioMovimientos;
import uy.org.softtech.cssuite.repositorios.RepositorioPagos;
import uy.org.softtech.cssuite.servicios.ServiciosFinancieros;

/**
 * Clase que implementa {@link ServiciosFinancieros}.
 * 
 * @author fabian.lobo
 * @see ServiciosFinancieros
 */
@Service(value = "servicios-financieros")
public class ServiciosFinancierosImpl extends Servicio implements ServiciosFinancieros {
	
	private Logger log = Logger.getLogger(getClass());
	
	@Resource(name = "repositorio-facturas" )
	RepositorioFacturas repositorioFacturas;
	
	@Resource(name = "repositorio-movimientos" )
	RepositorioMovimientos repositorioMovimientos;
	
	@Resource(name = "repositorio-pagos" )
	RepositorioPagos repositorioPagos;
	
	/**
	 * Método para verificar que todos los parámetros han sido seteados correctamente.
	 * 
	 * @author fabian.lobo
	 */
	@PostConstruct
	public void inicializacion(){
		notNull(repositorioFacturas(), "La propiedad [repositorioFacturas] de [" + getClass().getName() + "] no ha sido establecida.");
		notNull(repositorioMovimientos(), "La propiedad [repositorioMovimientos] de [" + getClass().getName() + "] no ha sido establecida.");
		notNull(repositorioPagos(), "La propiedad [repositorioPagos] de [" + getClass().getName() + "] no ha sido establecida.");
				
		log.info("Implementación de los servicios relacionados a las finanzas de los clientes ha sido inicializado correctamente.");
	}

	@Override
	public Set<Movimiento> obtenerMovimientos(Long id) {
		return repositorioMovimientos().obtenerMovimientos(id);
	}

	@Override
	public Set<Factura> obtenerFacturas(Long id) {
		return repositorioFacturas().obtenerFacturas(id);
	}

	@Override
	public Set<Pago> obtenerPagos(Long id) {
		return repositorioPagos().obtenerPagos(id);
	}

	/*
	 *  GETTERS
	 */
	public RepositorioFacturas repositorioFacturas() {
		return repositorioFacturas;
	}
	public RepositorioMovimientos repositorioMovimientos() {
		return repositorioMovimientos;
	}
	public RepositorioPagos repositorioPagos() {
		return repositorioPagos;
	}

}
